const userModel = require("../models/user")
//引入密码加密的包 bcrypt
const bcrypt = require("bcrypt")
//jwt
const jwt = require("jsonwebtoken")
const _ = require("lodash")
module.exports={
    //注册一个用户
    async addUser(ctx){
        //拿到前端传过来的数据
        const {name,password} = ctx.request.body;
        //检验body中数据的类型
        ctx.verifyParams({
            name: {type:"string", required:true},
            password:{type:"string", required:true}
        });
        //业务级别的验证;用户名不能重复
        const users = await userModel.find({name})
        //一旦throw了错误会终止代码的执行
        if(users.length!==0) ctx.throw(409,"用户名不能重复")
        //处理一下前端传来的数据
        const user = {name,password}
        //对密码进行加密处理
        //生成盐 & 对密码进行加密
        const salt =bcrypt.genSaltSync(10);
        user.password = bcrypt.hashSync(password,salt)
        //对数据库进行新增操作
        //res 新增的那一条数据
        const {_id} = await userModel.create(user);
        //对刚刚那一条新增的数据重新发起查询 为的是让投影启作用
        const userNoPassWord = await userModel.findById(_id)
        ctx.body = userNoPassWord;
    },
    //登录
    async login(ctx){
        //拿到前端传过来的数据
        const {name,password} = ctx.request.body;
        //判断一下name是否在用户集合中
        const users = await userModel.find({name}).select("+password")
        if(users.length !== 1) ctx.throw(404,"当前用户不存在")
        //如果name存在 则去校验password是否正确
        let user = users[0]
        if (!bcrypt.compareSync(password,user.password)) ctx.throw(403,"密码错误")

        //登录成功之后应该要返回一个token字符串
        const token = jwt.sign({_id:user._id,name:user.name},"xxxxx",{expiresIn:"7d"})
        ctx.body=token
    },





    //查询到所有的用户
    getAll(ctx){
        //连接数据库的代码 代码本身没问题  可有可能在网络没有连上的情况导致代码报错
        //console.log(xxx)
        ctx.body=users
    },
    //根据id查询用户
    getUserById(ctx){
        const id = +ctx.params.id;
        if(id < 0){ctx.throw(412,"id不能为负值")};
        const user = users.filter(user => user.id === id)[0]
        ctx.body = user;
    },
    //根据id更新用户
    updateUserById(ctx){
        const id = +ctx.params.id;
        const user = users.filter(user => user.id === id)[0]
        const {name,age} = ctx.request.body;
        name ? user.name=name : ctx.throw(422,"用户名必传")
        age ? user.age=age  : ctx.throw(422,"用户年龄必传")
        ctx.body = user
    },
    //根据id删除用户
    deleteUserById(ctx){
        const id = +ctx.params.id;
        users =  users.filter(user => user.id !== id);
        ctx.body = undefined
    }
}